#ifndef TOOLS_H
#define TOOLS_H
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <getch.h>
#include <string.h>
#include <assert.h>
#include "md5.h"

#define GOODS_MAX 50  
#define VIP_MAX 20    //商品最大总数为50，vip为20,后勤人员最大数量为20
#define PERSON_MAX 20

#define REDUCE_PERSON 1  //删除类型
#define REDUCE_VIP 2
#define REDUCE_GOODS 3

#define QUERY_PERSON 1
#define QUERY_VIP    2
#define QUERY_GOODS  3

typedef struct Goods   //商品结构体
{
	double price;       //价格
    int id;             //商品id
    short num;          //商品数量
    char name[20];      //商品名字
}Goods;

typedef struct Vip  //VIP结构体
{
    char phone[20]; //vip电话
    char password[33];
    int points;//积分
}Vip;

typedef struct Person  //后勤人员结构体
{
    char name[20];
    char password[33];
    int id;
}Person;

typedef struct Money  //账户结构体
{
    char account[20];
    double account_money;
    double money_sum;
}Money;

typedef struct Md5_value
{
    unsigned char goods_value[33];
    unsigned char vip_value[33];
    unsigned char person_value[33];
}Md5_value;

extern int cnt_goods; //商品现在的总数
extern int cnt_vip;   //vip现在的总数
extern int cnt_person; //后勤人员现在的总数
extern Goods goods[GOODS_MAX];
extern Vip vip[VIP_MAX];
extern Person person[PERSON_MAX];
extern Money money;
extern Md5_value md5_value;


char get_cmd(char start,char end);

void print_sec(const char* msg,float sec);

void anykey_continue(void);

char* get_str(char* str,size_t size);

char* get_passwd(char* passwd,size_t size);

bool yes_or_no(void);

// 通用的二进制保存数据
int save_data(void* base,size_t size,const char* path);

// 通用的二进制加载数据
int load_data(void* base,size_t size,const char* path);

//查找函数
int query_goodsname2(void); 				//输入商品名 查找商品

int query_goodsid2(void); 				    //输入商品id 查找商品

int query_goodsname(const char* s);         //用商品名查找商品

int query_goodsid(const int id);      	    //用商品ID查找商品

int query_personname(const char* s); 	    //用员工名字 查找员工

int query_vipphone(const char* s); 		    //用VIP电话 查找VIP

int query_personid(const int id); 		    //用员工ID 查找员工

int choose_goods(void);     				//选择输入一项商品数据查询  返回该商品在结构体数组的第几个

int get_personid(void);           		    //自动寻找后勤空余ID

int get_goodsid(void);		  			    //自动寻找商品空余ID



void reduce(int n,int type);                    //根据不同类型删除结构体

//qsort排序中的cmp
int cmp_personid(const void* e1, const void* e2);   //比较person中的id大小

int cmp_points(const void* p1, const void* p2);	    //比较VIP中的points大小

int cmp_goodsid(const void* p1, const void* p2);    //比较goodsn中的id大小


/*
void sort_goods(Goods *p,int n);				//排序后勤人员,以ID为标准

void sort_person(Person *p,int n);				//排序商品,以ID为标准

void sort_vip(Vip *p,int n);				    //排序VIP,以积分为标准
*/

void save_alldata_main(void);

void load_alldata_main(void);

void save_file_md5();

void get_file_md5(const char* path,unsigned char* value);           //获取文件MD5值封装函数

bool query_file(const char* path1,int type);    //对比文件是否一致 不一致返回false

#endif//TOOLS_H